#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time    : 2024/12/7 2:51
# @Author  : 唐松
# @File    : conftest.py
# @Software: PyCharm

import json
import pytest
import requests
from filelock import FileLock
from configs.config import write_extract_yaml, clear_extract_yaml


# 可以写前置条件，比如登录接口。获取token、cookie。用于项目全局使用
def front_loaded():
    # 清理extract.yaml文件内容
    clear_extract_yaml()
    # 登录接口，获取token与cookie
    url = "http://127.0.0.1:8787/dar/user/login"
    data = {
        "user_name": "test01",
        "passwd": "admin123"
    }
    response = requests.post(url=url, data=data)
    result_json = response.json()
    print(f"登录接口:{result_json}")
    # 项目接口使用cookie做管理，就将登录接口中cookie获取存入extract.yaml文件中
    set_cookie = requests.utils.dict_from_cookiejar(response.cookies)
    write_extract_yaml({'Cookie': set_cookie})
    # 将token获取存入extract.yaml文件中
    login_token = {'token': result_json['token']}
    write_extract_yaml(login_token)
    return set_cookie


# 处理多线程运行接口
@pytest.fixture(scope="session", autouse=True)
def session_data(tmp_path_factory, worker_id):
    # 如果当前进程是主线程
    if worker_id == "master":
        # 产生数据并缓存
        data = front_loaded()
        return data

    # 获取所有工作进程共享的临时目录
    root_tmp_dir = tmp_path_factory.getbasetemp().parent
    # 定义一个名为fn的文件路径，指向root_tmp_dir目录下的data.json文件
    fn = root_tmp_dir / "data.json"
    # 使用文件锁来保证数据的一致性
    with FileLock(str(fn) + ".lock"):
        # 如果fn文件存在，则读取其中的数据
        if fn.is_file():
            data = json.loads(fn.read_text())
        else:
            # 登录并获取cookie
            data = front_loaded()
            fn.write_text(json.dumps(data))
        return data